package com.github.ghsea.kafka.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;

/**
 * @author guhai
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "kafka.producer")
@PropertySource("classpath:application.yml")
public class ProducerProperties {

    /**
     * 生产者发送失败后的重试次数，默认0
     */
    private Integer produceReties;

    /**
     * keySerializer
     */
    private String keySerializer;

    /**
     * valueSerializer
     */
    private String valueSerializer;

    /**
     * 只要有多个记录被发送到同一个分区，生产者就会尝试将记录一起分成更少的请求。
     * 这有助于客户端和服务器的性能。该配置以字节为单位控制默认的批量大小。
     * 不会尝试批量大于此大小的记录。发送给brokers的请求将包含多个批次，每个分区有一个可用于发送数据的分区。
     * 小批量大小将使批次不太常见，并可能降低吞吐量（批量大小为零将完全禁用批次）。
     * 一个非常大的批量大小可能会更浪费一点使用内存，因为我们将始终为预期的额外记录分配指定批量大小的缓冲区
     */
    private Integer batchSize;

    /**
     * 往kafka服务器提交消息间隔时间，0则立即提交不等待
     */
    private Integer lingerMs;

    /**
     * 生产者可用于缓冲等待发送到服务器的记录的总内存字节数。
     * 如果记录的发送速度比发送到服务器的速度快，那么生产者将会阻止max.block.ms它，然后它会抛出异常。
     */
    private Integer bufferMemory;

    /**
     * acks=0如果设置为零，则生产者不会等待来自服务器的任何确认。
     * 该记录将被立即添加到套接字缓冲区并被视为已发送。
     * 在这种情况下，retries不能保证服务器已经收到记录，并且配置不会生效（因为客户端通常不会知道任何故障）。
     * 为每个记录返回的偏移量将始终设置为-1。
     *
     * acks=1这意味着领导者会将记录写入其本地日志中，但会在未等待所有追随者完全确认的情况下作出响应。
     * 在这种情况下，如果领导者在承认记录后但在追随者复制之前立即失败，那么记录将会丢失。
     *
     * acks=all这意味着领导者将等待全套的同步副本确认记录。
     * 这保证只要至少有一个同步副本保持活动状态，记录就不会丢失。
     * 这是最强有力的保证。这相当于acks = -1设置。
     */
    private String acks;

    private String transactionPrefix;

    private String compressionType;

}